#import "event.h"

#define DRAWING_EVENT_TYPE 111

/**
* Enumeracion de tipos de eventos de 
* dibujo disponibles
*/
typedef enum __DrawingEventType
{
	LINE,
	RECTANGLE,
	ELLIPSE,
	CIRCLE,
	TRIANGLE,
	FILLED_RECTANGLE,
	FILLED_ELLIPSE,
	FILLED_CIRCLE,
	FILLED_TRIANGLE,
	HAND_DRAW,
} DrawingEventType;

/**
* @brief Clase que modela un evento de dibujo
* @author Carlos Rodriguez Dominguez
* @date 6/12/2008
*
* Clase que modela un evento de dibujo para transmitir informacion 
* acerca de figuras geometricas. Esta clase pone como campo "type" 
* el valor definido por @see DRAWING_EVENT_TYPE. Ademas, agrega
* un campo llamado "draw_type" que se asignara con algun valor
* definido por la enumeracion @see __DrawingEventType, y otro
* campo llamado "color" que contendra una cadena de texto con la 
* representacion en hexadecimal del color de la figura (ej: 0x2384ff).
*/
@interface DrawingEvent : Event {
	
}

-(id) initWithCommunicator:(id<ICECommunicator>)c andType:(DrawingEventType)d_evt_type;
-(int) subType;
-(NSString*) color;
-(void) setColor:(NSString*)color;

@end

/**
* @brief Clase que modela un evento que transmite una linea
* @author Carlos Rodriguez Dominguez
* @date 6/12/2008
*
* Modela un evento que transmite una linea. Para ello crea
* los campos "x0", "y0", "x1" e "y1" en el evento.
*/
@interface LineEvent : DrawingEvent {
	
}

-(id) initWithCommunicator:(id<ICECommunicator>)c x0:(float)_x0 y0:(float)_y0 x1:(float)_x1 y1:(float)_y1;
-(float) x0;
-(float) y0;
-(float) x1;
-(float) y1;

@end

/**
* @brief Clase que modela un evento que transmite un rectangulo
* @author Carlos Rodriguez Dominguez
* @date 6/12/2008
*
* Modela un evento que transmite un rectangulo. Para ello crea
* los campos "x", "y", "width" e "height" en el evento. Los
* valores x e y indican la posicion de la esquina superior izquierda.
*/
@interface RectangleEvent : DrawingEvent {
	
}

-(id) initWithCommunicator:(id<ICECommunicator>)c x:(float)_x y:(float)_y width:(float)w height:(float)h;
-(float) x;
-(float) y;
-(float) width;
-(float) height;

@end

/**
* @brief Clase que modela un evento que transmite un rectangulo relleno
* @author Carlos Rodriguez Dominguez
* @date 6/12/2008
*
* Modela un evento que transmite un rectangulo relleno. Tiene metodos
* para asignar el color de relleno o para obtenerlo.
*/
@interface FilledRectangleEvent : RectangleEvent {
	
}

-(id) initWithCommunicator:(id<ICECommunicator>)c x:(float)_x y:(float)_y width:(float)w height:(float)h;
-(NSString*) fillColor;
-(void) setFillColor:(NSString*)color;

@end

/**
* @brief Clase que modela un evento que transmite una elipse
* @author Carlos Rodriguez Dominguez
* @date 6/12/2008
*
* Modela un evento que transmite una elipse. Para ello crea
* los campos "x", "y", "width" e "height" en el evento. Los
* valores x e y indican la posicion del centro de la elipse.
*/
@interface EllipseEvent : DrawingEvent {
	
}

-(id) initWithCommunicator:(id<ICECommunicator>)c x:(float)_x y:(float)_y width:(float)w height:(float)h;
-(float) x;
-(float) y;
-(float) width;
-(float) height;

@end

/**
* @brief Clase que modela un evento que transmite una elipse rellena
* @author Carlos Rodriguez Dominguez
* @date 6/12/2008
*
* Modela un evento que transmite una elipse rellena. Para ello crea
* los campos "x", "y", "width" e "height" en el evento. Los
* valores x e y indican la posicion del centro de la elipse. Tiene metodos
* para asignar el color de relleno o para obtenerlo.
*/
@interface FilledEllipseEvent : EllipseEvent {
	
}

-(id) initWithCommunicator:(id<ICECommunicator>)c x:(float)_x y:(float)_y width:(float)w height:(float)h;
-(NSString*) fillColor;
-(void) setFillColor:(NSString*)color;

@end

/**
* @brief Clase que modela un evento que transmite un circulo
* @author Carlos Rodriguez Dominguez
* @date 6/12/2008
*
* Modela un evento que transmite un circulo. Para ello crea
* los campos "x", "y", y "radius" en el evento. Los valores 
* x e y indican la posicion del centro del circulo.
*/
@interface CircleEvent : DrawingEvent {
	
}

-(id) initWithCommunicator:(id<ICECommunicator>)c x:(float)_x y:(float)_y radius:(float)r;
-(float) x;
-(float) y;
-(float) radius;

@end

/**
* @brief Clase que modela un evento que transmite un circulo relleno
* @author Carlos Rodriguez Dominguez
* @date 6/12/2008
*
* Modela un evento que transmite un circulo relleno. Para ello crea
* los campos "x", "y", y "radius" en el evento. Los valores x e y 
* indican la posicion del centro del circulo. Tiene metodos
* para asignar el color de relleno o para obtenerlo.
*/
@interface FilledCircleEvent : CircleEvent {
	
}

-(id) initWithCommunicator:(id<ICECommunicator>)c x:(float)_x y:(float)_y radius:(float)r;
-(NSString*) fillColor;
-(void) setFillColor:(NSString*)color;

@end

/**
* @brief Clase que modela un evento que transmite un triangulo
* @author Carlos Rodriguez Dominguez
* @date 6/12/2008
*
* Modela un evento que transmite un triangulo. Para ello crea
* los campos "x0", "y0", "x1", "y1", "x2" y "y2" en el evento.
*/
@interface TriangleEvent : DrawingEvent {
	
}

-(id) initWithCommunicator:(id<ICECommunicator>)c x0:(float)_x0 y0:(float)_y0 x1:(float)_x1 y1:(float)_y1 x2:(float)_x2 y2:(float)_y2;
-(float) x0;
-(float) y0;
-(float) x1;
-(float) y1;
-(float) x2;
-(float) y2;

@end

/**
* @brief Clase que modela un evento que transmite un triangulo relleno
* @author Carlos Rodriguez Dominguez
* @date 6/12/2008
*
* Modela un evento que transmite un triangulo relleno. Para ello crea
* los campos "x0", "y0", "x1", "y1", "x2" y "y2" en el evento. Tiene metodos
* para asignar el color de relleno o para obtenerlo.
*/
@interface FilledTriangleEvent : TriangleEvent {
	
}

-(id) initWithCommunicator:(id<ICECommunicator>)c x0:(float)_x0 y0:(float)_y0 x1:(float)_x1 y1:(float)_y1 x2:(float)_x2 y2:(float)_y2;
-(NSString*) fillColor;
-(void) setFillColor:(NSString*)color;

@end

/**
* @brief Clase que modela un evento que transmite un dibujo a mano alzada
* @author Carlos Rodriguez Dominguez
* @date 6/12/2008
*
* Modela un evento que transmite un dibujo a mano alzada. Para ello crea
* los campos "x0", "y0", "x1", "y1", ..., "xn" y "yn" en el evento.
*/
@interface HandDrawEvent : DrawingEvent {
	
}

-(id) initWithCommunicator:(id<ICECommunicator>)c npoints:(int)n;
-(int) npoints;
-(float) xn:(int)n;
-(float) yn:(int)n;
-(void) setXn:(int)n x:(float)_x;
-(void) setYn:(int)n y:(float)_y;

@end
